// To wait for multiple goroutines to finish, we can use a wait group.
package main

import (
	"fmt"
	"sync"
	"time"
)

func worker2(id int) {
	fmt.Printf("Worker %d starting\n", id)

	time.Sleep(time.Second)
	fmt.Printf("Worker %d done\n", id)
}

func main() {

	var wg sync.WaitGroup

	for i := 1; i <= 5; i++ {
		//调用 wg.Add(1) 将 WaitGroup 的计数加 1，表示有一个新的 Goroutine 即将开始工作。
		wg.Add(1)

		j := i

		go func() {
			//defer wg.Done() 来确保在 Goroutine 执行完毕时减少 WaitGroup 的计数 -1
			//这样，无论 Goroutine 正常执行结束还是发生了 panic，Done 方法都会被调用，保证计数减少。
			defer wg.Done()
			worker2(j)
		}()
	}

	wg.Wait()

}
